# -*- coding: utf-8 -*-
# time: 2025/4/9 10:31
# file: ch01.py
# author: hanson
"""
https://www.langchain.com.cn/docs/introduction/
https://www.langchain.com.cn/docs/tutorials/llm_chain/
"""

from langchain_core.prompts import PromptTemplate, ChatPromptTemplate
from langchain_ollama import ChatOllama

template = "桌上有{number}个苹果，四个桃子和3本书共有几个水果?"
prompt = PromptTemplate.from_template(template)

# 创建模型实例
# llm = ChatOpenAI(temperature=0)
# 可以通过指令 ollama show qwen2.5:7b --path 查看目录  ollama list
llm = ChatOllama(model="qwen2.5:1.5b", temperature=0.3)
# 创建链  | 符号是 channel 管道意思。
chain = prompt | llm

# 调用链
result = chain.invoke({"number": 5})
print(result)

"""
使用 LangChain 的 ChatPromptTemplate 定义一个 对话式提示模板（Prompt Template），用于结构化地生成 AI 对话的输入。具体作用：
system 消息：设定 AI 的角色和背景（如“你是世界级的技术专家”），引导模型的行为风格。
user 消息：提供用户输入（如 {input} 是一个占位符，运行时会被实际用户问题替换）
 Prompt 会像这样传递给模型：
 [
    {"role": "system", "content": "你是世界级的技术专家"},
    {"role": "user", "content": "如何优化Python代码性能？"}
]

为什么需要 system 和 user 两个角色？
"""
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是世界级的技术专家"),
    ("user", "{input}")
])
chain = prompt | llm
result = chain.invoke({"input": "帮我写一个关于ai的100字左右的技术文章"})
print(result.content)
print(result.additional_kwargs)  # 表示调用时传入的附加参数，本例中 {'refusal': None} 表示未设置拒绝信息或其他附加参数。
# token_usage：记录本次调用使用的 token 数量：completion_tokens：模型生成回复使用了 176 个 token。
# total_tokens：总共使用了 217 个 token（输入与输出相加）。
print(result.response_metadata)
# input_tokens：输入的 token 数量;output_tokens：输出的 token 数量
